环境
gdb + peda + pwndbg
ubuntu 16.04
分析
poc(exp可以查看底部链接,不过那个exp不好使,因为好像便宜不对,而且返回地址是写死的)
1 | import os |
直接运行会报错,缺少/usr/local/etc/no-ip2.conf
文件,查看文档,可以看到-C可以新建
1 | $ ./noip2-i686 -h |
通过exploit-db的信息,我们知道漏洞在-i处
1 | gdb-peda$ r -i `python -c "print 'A'*500"` |
输出的看到最后一行是Use the NAT facility.,我们IDA找一下,是在handle_dynup_error函数里面,发现这里只是输出
1 | case 27: |
但是调用这个的有很多,不好确定是哪个,我们再看上一个字符串Recovering dead process 111467 shmem slot
,发现是在get_shm_info
函数里面
1 | for ( i = 0; i <= 3; ++i ) |
在Msg("Recovering dead process %d shmem slot", *(_DWORD *)v13);
处下断点,栈数据没有被破坏,所以这还没到漏洞点,这时已经回到main函数了
只剩后面这些代码了,由于IPaddress我们指定了,所以肯定不为0 ,进入的是第二个if,那么下面这些函数没看出什么漏洞,那么漏洞应该在dynamic_update里面
1 | if ( get_shm_info() != -1 ) |
我们执行到call dynamic_update
,ni就蹦了,IDA查看这个函数,很快就可以看到这个漏洞点了
1 | sprintf(&s, "&ip=%s", &IPaddress); |
我们调试确认一下
1 | 0x804c032 <dynamic_update+79> call bdecode <0x804e989> |
我们再看看IPaddress的位置
1 | db-peda$ x /76wx 0x80573bc |
可以看到确实是sprintf的时候溢出的,我们不断单步到ret,确实返回地址被覆盖成0x41414141了
1 | EAX 0xffffffff |
简单总结
所以漏洞成因就是dynamic_update中的sprintf(&s, "&ip=%s", &IPaddress);
拼接,建议使用snprintf